/**
 * NettyServer.js - TCP长连接服务器
 * 用于接收客户端连接并推送热键信息
 */
const net = require('net');

/**
 * NettyServer类
 * 模拟Java版本中的Netty服务器功能，提供TCP长连接服务
 */
class NettyServer {
  /**
   * 构造函数
   * @param {Object} options - 配置选项
   * @param {number} options.port - 服务器端口
   * @param {string} options.host - 服务器主机
   * @param {ClientConnManager} options.clientManager - 客户端连接管理器
   * @param {Function} options.onKeyEvent - 键事件回调函数
   */
  constructor(options = {}) {
    this.port = options.port || 11111;
    this.host = options.host || '0.0.0.0';
    this.server = null;
    this.clientManager = options.clientManager;
    this.onKeyEvent = options.onKeyEvent;
    this.running = false;
  }

  /**
   * 启动服务器
   * @returns {Promise<void>}
   */
  start() {
    return new Promise((resolve, reject) => {
      if (this.running) {
        return resolve();
      }

      this.server = net.createServer((socket) => this._handleConnection(socket));

      this.server.on('error', (err) => {
        console.error('服务器错误:', err);
        reject(err);
      });

      this.server.listen(this.port, this.host, () => {
        this.running = true;
        console.log(`长连接服务器启动于 ${this.host}:${this.port}`);
        resolve();
      });
    });
  }

  /**
   * 停止服务器
   * @returns {Promise<void>}
   */
  stop() {
    return new Promise((resolve) => {
      if (!this.running || !this.server) {
        return resolve();
      }

      this.server.close(() => {
        this.running = false;
        console.log('长连接服务器已停止');
        resolve();
      });
    });
  }

  /**
   * 处理新连接
   * @param {net.Socket} socket - 客户端socket
   * @private
   */
  _handleConnection(socket) {
    const clientId = `${socket.remoteAddress}:${socket.remotePort}`;
    console.log(`新客户端连接: ${clientId}`);

    // 将新连接添加到客户端管理器
    if (this.clientManager) {
      this.clientManager.addConnection(clientId, socket);
    }

    // 设置编码
    socket.setEncoding('utf8');

    // 处理连接关闭
    socket.on('close', () => {
      console.log(`客户端断开连接: ${clientId}`);
      if (this.clientManager) {
        this.clientManager.removeConnection(clientId);
      }
    });

    // 处理错误
    socket.on('error', (err) => {
      console.error(`客户端连接错误 ${clientId}:`, err);
      if (this.clientManager) {
        this.clientManager.removeConnection(clientId);
      }
    });

    // 处理接收到的数据
    socket.on('data', (data) => {
      try {
        const message = JSON.parse(data);
        console.log(`接收到客户端消息(${clientId}):`, message);
        
        // 处理注册应用消息
        if (message.type === 'register' && message.appName) {
          this.clientManager.registerApp(clientId, message.appName);
          socket.write(JSON.stringify({ type: 'register_ack', success: true }));
        }
        // 处理键事件
        else if (message.type === 'key_event') {
          // 创建热键模型
          const hotKeyModel = {
            key: message.key,
            appName: message.appName,
            keyType: message.keyType,
            count: message.count || 1
          };
          
          console.log(`收到键事件(${clientId}): ${message.appName}:${message.keyType}:${message.key}`);
          
          // 如果设置了onKeyEvent回调，则触发它
          if (this.onKeyEvent) {
            this.onKeyEvent(hotKeyModel);
          }
          
          // 确认收到
          socket.write(JSON.stringify({ 
            type: 'key_event_ack', 
            key: message.key,
            received: true
          }), function (err){
            if (err) {
              console.error(`向客户端 ${clientId} 确认键事件失败:`, err);
            } else {
              console.log(`键事件确认已发送到客户端 ${clientId}`);
            }
          });
        }
      } catch (err) {
        console.error(`解析客户端消息失败(${clientId}):`, err);
      }
    });
    
    // 发送欢迎消息
    socket.write(JSON.stringify({ 
      type: 'welcome',
      message: 'Connected to HotKey Worker',
      serverId: process.pid
    }));
  }
}

module.exports = NettyServer;